gold.lang.require('gold.util.TypeChecker');

gold.TestRunner.add('TypeChecker Test', function() {
	var testCorrectValues = function(method, values) {
		for (var i = 0; i < values.length; i++) {
			gold.assert(gold[method](values[i])).isTrue();
		}
	};
	var testIncorrectValues = function(method, values) {
		for (var i = 0; i < values.length; i++) {
			gold.assert(gold[method](values[i])).isFalse();
		}
	};
	return {
		testIsString: function(){
			testIncorrectValues('isString', [{}, [], null, undefined, 0, -1, false, true]);
			testCorrectValues('isString', ['', ' ']);
		},
		testIsNumber: function(){
			testIncorrectValues('isNumber', [{}, [], null, undefined, '', '-1', false, true]);
			testCorrectValues('isNumber', [0, -0.1]);
		},
		testIsBoolean: function(){
			testIncorrectValues('isBoolean', [{}, [], null, undefined, '', '-1', 'false', 'true', 0, -1]);
			testCorrectValues('isBoolean', [true, false]);
		},
		testIsFunction: function(){
			testIncorrectValues('isFunction', [{}, [], null, undefined, '', '-1', 'false', 'true', 0, -1, true, false]);
			testCorrectValues('isFunction', [function(){}]);
		},
		testIsObject: function(){
			testIncorrectValues('isObject', [function(){}, null, undefined, '', '-1', 'false', 'true', 0, -1, true, false]);
			testCorrectValues('isObject', [{}, []]);
		}
	};
});
